#ifndef __TASKQUEUE_H__
#define __TASKQUEUE_H__

#include "MutexLock.h"
#include "Condition.h"
#include <queue>
#include <functional>

using std::queue;
using std::function;

using ElemType = function<void()>;

class TaskQueue
{
public:
    TaskQueue(size_t queSize);
    ~TaskQueue();
    bool empty() const;
    bool full() const;
    //可以向任务队列中生产数据
    void push(ElemType &&task);
    //可以从任务队列中获取数据
    ElemType pop();

    //将所有等待在_notEmpty条件变量上的线程唤醒
    void wakeup();

private:
    size_t _queSize;//任务队列的大小
    queue<ElemType> _que;//存放数据的容器
    MutexLock  _mutex;//互斥锁
    Condition _notEmpty;//非空的条件变量
    Condition _notFull;//非满的条件变量
    bool _flag;
};

#endif
